﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DM01Sate : MonoBehaviour
{
    void Start()
    {
        Context context = new Context();
        context.SetState(new ConcreteStateA(context));
        context.Handle(5);
        context.Handle(20);
    }
}

public class Context
{
    private IState mState;
    public void SetState(IState state)
    {
        mState = state;
    }

    public void Handle(int arg)
    {
        mState.Handle(arg);
    }
}

// 为什么要定义接口，接口和类的区别
// 因为接口的作用是用于约束类、对象、函数的标准规则
public interface IState
{
    void Handle(int arg);
}

//// 为什么要定义接口不定义类，接口和类的区别
//public class IState
//{
//    public void Handle(int arg) { } // 如果定义的是类，此处就是方法，而子类就要重写这个方法！
//}
// 此处需要的是一种标准规则，声明类中有一个名为Handle的方法，而不是一个实实在在的方法再去重写这个方法！
// 类继承于接口，效果就是使用了这个接口的规则
public class ConcreteStateA : IState
{
    private Context mContext;
    public ConcreteStateA(Context context)
    {
        mContext = context;
    }

    public void Handle(int arg)
    {
        Debug.Log("ConcreateStateA.Handle " + arg);
        if (arg > 10)
        {
            mContext.SetState(new ConcreteStateB(mContext));
        }
    }
}

public class ConcreteStateB : IState
{
    private Context mContext;
    public ConcreteStateB(Context context)
    {
        mContext = context;
    }

    public void Handle(int arg)
    {
        Debug.Log("ConcreateStateB.Handle " + arg);
        if (arg <= 10)
        {
            mContext.SetState(new ConcreteStateA(mContext));
        }
    }
}
